/**
 * 
 */
package com.study.serialize;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import lombok.Data;
import lombok.ToString;

/**
 * @author Administrator
 * @date 2019年5月3日
 */
public class SerializeTest {

	private static Person person;

	public static void main(String[] args) throws FileNotFoundException, Exception {
		//serializePerson();
		deserializePerson();
		
		System.out.println(person);
	}
	
	private static void serializePerson() throws FileNotFoundException, IOException{
		person = new Person();
		person.setAge(12);
		person.setName("xiaoming");
		person.setSex("M");
		
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("./person.txt")));
		objectOutputStream.writeObject(person);
		System.out.println("序列化成功。。。");
		objectOutputStream.close();
	}
	
	private static Person deserializePerson() throws FileNotFoundException, IOException, ClassNotFoundException{
		ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("./person.txt")));
		person = (Person) objectInputStream.readObject();
		System.out.println("反序列化成功。。。");
		return person;
		
	}
}

@Data
@ToString
class Person implements Serializable {
	private static final long serialVersionUID = -5809782578272943999L;
	
	private int age;
    private String name;
    private String sex;
    private String address;
}

/*
1. 如果Person 类没有进行序列化，则程序报错:
Exception in thread "main" java.io.NotSerializableException: com.study.serialize.Person
2. Person 加上Serializable 接口实现，程序正常：
	序列化成功。。。
	反序列化成功。。。
	Person(age=12, name=xiaoming, sex=M)
	
3. 如果在反序列化前对Person 对象进行修改(如增加address 参数), 则反序列化不成功： 
Exception in thread "main" java.io.InvalidClassException: com.study.serialize.Person; 
local class incompatible: stream classdesc serialVersionUID = -464380394363442885, local class serialVersionUID = -5788535718412542754

可以看到，当我们修改Person类的时候，Person类对应的SerialversionUID也变化了，
而序列化和反序列化就是通过对比其SerialversionUID来进行的，一旦SerialversionUID不匹配，反序列化就无法成功。

4. 在Person类中加入自定义SerialversionUID，
保证不管我们序列化之后如何更改我们的Person（不删除原有字段），最终都可以反序列化成功。

*/